﻿#include <iostream>
// #include <stdio.h>

#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"

#define QUEUE_LENGTH 5
#define ITEM_SIZE sizeof(uint32_t)

// 定义队列句柄
QueueHandle_t xQueue;

// 发送任务
void vSenderTask(void *pvParameters) {
    uint32_t ulValueToSend = 0;

    while (1) {
        // 发送数据到队列
        if (xQueueSend(xQueue, &ulValueToSend, portMAX_DELAY) == pdPASS) {
        	std::cout<<"send: "<<ulValueToSend<<std::endl;
            // printf("发送数据: %d\n", ulValueToSend);
            ulValueToSend++;
        }
        vTaskDelay(pdMS_TO_TICKS(1000));  // 每秒发送一次
    }

    // 确保任务清除成功
    // vTaskDelete(nullptr);
}

// 接收任务
void vReceiverTask(void *pvParameters) {
    uint32_t ulReceivedValue;

    while (1) {
        // 从队列接收数据
        if (xQueueReceive(xQueue, &ulReceivedValue, portMAX_DELAY) == pdPASS) {
            // printf("接收数据: %d\n", ulReceivedValue);
        	std::cout<<"receive: "<<ulReceivedValue<<std::endl;
        }
    }

    // 确保任务清除成功
    // vTaskDelete(nullptr);
}

// 主函数
int main(void) {
    // 创建队列
    xQueue = xQueueCreate(QUEUE_LENGTH, ITEM_SIZE);
    if (xQueue != NULL) {
        // 创建发送任务
        xTaskCreate(vSenderTask, "Sender", configMINIMAL_STACK_SIZE, NULL, 1, NULL);
        // 创建接收任务
        xTaskCreate(vReceiverTask, "Receiver", configMINIMAL_STACK_SIZE, NULL, 1, NULL);

        // 启动调度器
        vTaskStartScheduler();
    }

    // 如果调度器返回，说明系统出现了错误
    for (;;);
    return 0;
}
